public class code4 {
//    top 101 两个链表的第一个公共节点

    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        // 这里的思路是，分别先测出两个链表的长度
        // 通过 计算两个链表的差值，来让某一个部分的链表的指针先向前移动
        // 当两个链表达到同一个起点后，同时向后移动执行，找到交汇的节点直接返回
        ListNode cur1 = pHead1;
        ListNode cur2 = pHead2;

        // 定义 a、b 来记录两个链表的长度
        int a = 0;
        int b = 0;
        // 定义 c 来记录当前两个链表的差值
        int c = 0;

        while(cur1 != null) {
            cur1 = cur1.next;
            a++;
        }

        while(cur2 != null) {
            cur2 = cur2.next;
            b++;
        }
        // 让两个指针恢复到链表头位置
        cur1 = pHead1;
        cur2 = pHead2;

        if(a > b) {
            // 当 a 大于 b 时，此时将 pHead1 链表先标到 相同位置
            c = a - b;
            while(c > 0) {
                cur1 = cur1.next;
                c--;
            }
        }
        if (a < b) {
            c = b - a;
            while(c > 0) {
                cur2 = cur2.next;
                c--;
            }
        }

        // 当定位到相同位置后，同时向后遍历找到相交点
        while(cur1 != cur2) {
            cur1 = cur1.next;
            cur2 = cur2.next;
        }

        return cur1;
    }
}
